home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / pctekap1.arc / DPFILE.ASM < prev    next >
Assembly Source File  |  1986-03-15  |  11KB  |  394 lines

  1.     PAGE
  2. TITLE    DPFILE
  3. ;
  4. ;    (C)COPYRIGHT 1983 - REAL TIME CONCEPTS, INC.
  5. ;
  6. ;    AUTHOR: THOMAS V. CARTER
  7. ;
  8. ;    PC DOS FILE DUMP UTILITY PROGRAM
  9. ;
  10. ;    ALLOCATE THE STACK WORK AREA
  11. ;
  12. STACKS    SEGMENT PARA STACK 'STACK'
  13. ;
  14.     DB    50 DUP('$$')
  15. ;
  16. STACKS    ENDS
  17. ;
  18.     PAGE
  19. ;
  20. ;    ALLOCATE THE WORKING STORAGE SEGMENT
  21. ;
  22. WSTORE    SEGMENT PARA PUBLIC 'DATA'
  23. ;
  24. ;    ALLOCATE THE FILE NAME OPERATOR PROMPT
  25. ;
  26. FILNAM    DB    'File name = '
  27.     DB    '$'
  28. ;
  29. ;    ALLOCATE THE BLOCK NUMBER TEXT AND WORK AREAS
  30. ;
  31. BLKNUM    DB    'Block Number = '
  32. ;
  33. BCOUNT    DB    '0000'
  34.     DW    0A0DH
  35.     DW    0A0DH
  36.     DB    '$'
  37. ;
  38. ;    ALLOCATE THE FILE OPEN ERROR ERROR MESSAGE
  39. ;
  40. OPNERM    DB    'File open error'
  41.     DW    0A0DH
  42.     DB    '$'
  43. ;
  44. ;    ALLOCATE THE FILE NOT FOUND ERROR MESSAGE
  45. ;
  46. NOFILE    DB    'File not found'
  47.     DW    0A0DH
  48.     DB    '$'
  49. ;
  50. ;    DEFINE CARRIAGE RETURN AND LINE FEED CHARACTERS
  51. ;
  52. CRLFLN    DW    0A0DH
  53.     DB    '$'
  54. ;
  55. ;    BINARY TO HEXADECIMAL CONVERSION TABLE
  56. ;
  57. ASCIIT    DB    '0123456789ABCDEF'
  58. ;
  59.     PAGE
  60. ;
  61. ;    ALLOCATE FORM FEED CHARACTER
  62. ;
  63. FMFEED    DW    0A0DH
  64.     DB    0CH
  65.     DB    '$'
  66. ;
  67. ;    ALLOCATE THE I/O BUFFER // 512 BYTES PER BLOCK
  68. ;
  69. FILBUF    DB    512 DUP(' ')
  70. ;
  71. ;ALLOCATE THE FILESPEC INPUT STRUCTURE
  72. ;
  73. INPNAM    DB    15
  74.     DB    0
  75.     DB    15 DUP(' ')
  76. ;
  77. ;    ALLOCATE THE FILE DUMP PRINT LINE
  78. ;
  79. DPLINE    DB    78 DUP(' ')
  80.     DW    0A0DH
  81. ;
  82. ;    ALLOCATE THE HEXADECIMAL BUFFER OFFSET COUNTER
  83. ;
  84. HEXCNT    DW    0
  85. ;
  86. ;DEFINE BINARY TO DECIMAL DIVISORS
  87. ;
  88. BINDEC    DW    1000
  89.     DW    100
  90.     DW    10
  91. ;
  92. WSTORE    ENDS
  93.     PAGE
  94. ;
  95. ;    PC DOS FILE DUMP UTILITY PROGRAM
  96. ;
  97. CODSEG    SEGMENT PARA PUBLIC 'CODE'
  98. ;
  99. DPFILE    PROC    FAR
  100.     ASSUME     CS:CODSEG        ;CS = CODE SGEMENT
  101.     ASSUME     DS:WSTORE        ;DS = DATA SEGMENT
  102.     ASSUME     SS:STACKS        ;SS = STACK SEGMENT
  103. ;
  104. ;    INITIALIZE THE PROGRAM ENVIRONMENT
  105. ;
  106.     PUSH    DS            ;SAVE PROGRAM PREFIX SEGMENT
  107.     SUB    AX,AX            ;AX = ZERO // SET FOR STACK
  108.     MOV    BP,AX            ;BP = ZERO // STACK START
  109.     MOV    [BP],AX            ;SETUP BLOCK NUMBER ZERO
  110.     PUSH    AX            ;PUSH AX (ZERO) ON STACK
  111.     MOV    AX,WSTORE        ;AX = WORKING STORAGE SEGMENT
  112.     MOV    DS,AX            ;DS = WORKING STORAGE SEGMENT
  113. ;
  114. ;    DISPLAY THE FILE NAME PROMPT TO THE OPERATOR
  115. ;
  116.     MOV    DX,OFFSET FILNAM    ;DX = PROMPT OFFSET ADDRESS
  117.     MOV    AH,09H            ;AH = 9 = DISPLAY PROMPT
  118.     INT    21H            ;CALL DOS FOR SERVICE
  119. ;
  120. ;    ACQUIRE THE OPERATOR RESPONSE // FILESPEC 
  121. ;
  122.     MOV    DX,OFFSET INPNAM    ;DX = SEGMENT OFFSET ANSWER
  123.     MOV    AH,0AH            ;AH = A = KEYBOARD INPUT
  124.     INT    21H            ;CALL DOS FOR SERVICE
  125. ;
  126. ;    SEND CARRIAGE RETURN AND LINE FEED FOR APPEARANCES
  127. ;
  128.     MOV    DX,OFFSET CRLFLN    ;DX = CR/LF OFFSET ADDRESS
  129.     MOV    AH,09H            ;AH = 9 = DISPLAY CR AND LF
  130.     INT    21H            ;CALL DOS FOR SERVICE
  131. ;
  132. ;    PARSE THE OPERATOR SPECIFIED FILESPEC
  133. ;
  134.     MOV    SI,OFFSET INPNAM+2    ;SI = FILESPEC OFFSET ADDRESS
  135.     MOV    DI,5CH            ;DI = 1ST PROGRAM PREFIX FCB
  136.     SUB    AL,AL            ;AL = ZERO 
  137.     MOV    AH,29H            ;PARSE THE RECEIVED FILE NAME
  138.     INT    21H            ;CALL DOS FOR SERVICE
  139.     PAGE
  140. ;
  141. ;    FILESPEC PARSED (1ST PROGRAM PREFIX FCB) // OPEN THE FILE
  142. ;
  143.     PUSH    DS            ;SAVE THE DATA SEGMENT REGISTER
  144. ;
  145.     MOV    DX,5CH            ;DX = 1ST PROGRAM PREFIX FCB
  146.     MOV    AX,ES            ;AX = PROGRAM PREFIX SEGMENT
  147.     MOV    DS,AX            ;DS = PROGRAM PREFIX SEGMENT
  148.     MOV    AH,0FH            ;AH = F = OPEN THE FILE
  149.     INT    21H            ;CALL DOS FOR SERVICE
  150. ;
  151.     POP    DS            ;RESTORE DATA SEGMENT REGISTER
  152. ;
  153.     CMP    AL,0            ;AL = OPEN FILE RETURN STATUS
  154.     JE     DPF010            ;BRANCH IF SUCCESSFUL OPEN
  155. ;
  156. ;    FILE OPEN ERROR - NOTIFY THE OPERATOR AND TERMINATE
  157. ;
  158.     MOV    DX,OFFSET OPNERM    ;DX = OPEN ERROR MESSAGE OFFSET
  159.     MOV    AH,09H            ;AH = 9 = DISPLAY ERROR MESSAGE
  160.     INT    21H            ;CALL DOS FOR SERVICE
  161.     RET                ;TERMINATE PROGRAM EXECUTION
  162. ;
  163. ;    SEND CARRIAGE RETURN AND LINE FEED FOR APPEARANCES
  164. ;
  165. DPF010:
  166.     MOV    DX,OFFSET CRLFLN    ;DX = CR/LF OFFSET ADDRESS
  167.     MOV    AH,09H            ;AH = 9 = DISPLAY CR AND LF
  168.     INT    21H            ;CALL DOS FOR SERVICE
  169. ;
  170. ;    SETUP THE DATA TRANSFER ADDRESS (DTA)
  171. ;
  172.     MOV    DX,OFFSET FILBUF    ;DX = I/O BUFFER OFFSET ADDRESS
  173.     MOV    AH,1AH            ;AH = 1A = SETUP DTA
  174.     INT    21H            ;CALL DOS FOR SERVICE
  175. ;
  176. ;    INITIALIZE THE 1ST PROGRAM PREFIX FILE CONTROL BLOCK
  177. ;
  178.     MOV    DI,5CH            ;DI = FCB OFFSET ADDRESS
  179.     MOV    AX,512            ;AX = 512 = RECORD SIZE
  180.     MOV    ES:[DI+14],AX        ;SETUP LOGICAL RECORD SIZE
  181.     SUB    AX,AX            ;AX = ZERO
  182.     MOV    ES:[DI+32],AX        ;SETUP RANDOM RECORD NUMBER
  183.     MOV    ES:[DI+34],AX        ;SETUP RANDOM RECORD NUMBER
  184.     MOV    ES:[DI+36],AL        ;SETUP RANDOM RECORD NUMBER
  185.     PAGE
  186. ;
  187. ;    SETUP TO CLEAR THE FILE I/O BUFFER
  188. ;
  189. DPF020:
  190.     MOV    CX,256            ;CX = LOOP CONTROL COUNTER
  191.     MOV    DI,OFFSET FILBUF    ;DI = I/O BUFFER OFFSET ADDRESS
  192.     SUB    AX,AX            ;AX = ZEROS
  193. ;
  194. ;    SET THE CONTENTS OF THE I/O BUFFER TO BINARY ZEROS
  195. ;
  196. DPF030:
  197.     MOV    [DI],AX            ;SET I/O BUFFER TO BINARY ZEROS
  198.     ADD    DI,2            ;INCREMENT DI TO NEXT WORD
  199.     LOOP    DPF030            ;LOOP FOR ALL BUFFER WORDS
  200. ;
  201. ;    READ EACH 512 BYTE BLOCK OF THE FILE // RANDOM BLOCK READ
  202. ;
  203.     PUSH    DS            ;SAVE DATA SEGMENT REGISTER
  204.     MOV    AX,ES            ;AX = PROGRAM PREFIX SEGMENT
  205.     MOV    DS,AX            ;DS = PROGRAM PREFIX SEGMENT
  206.     MOV    DX,5CH            ;DX = 1ST PROGRAM PREFIX FCB
  207.     MOV    CX,1            ;CX = NUMBER OF RECORDS
  208.     MOV    AH,27H            ;AH = 27 = RANDOM BLOCK READ
  209.     INT    21H            ;CALL DOS FOR SERVICE
  210.     POP    DS            ;RESTORE DATA SEGMENT REGISTER
  211. ;
  212.     CMP    AL,0            ;VERIFY DISK READ COMPLETION
  213.     JE    DPF040            ;BRANCH IF SUCCESSFUL READ
  214.     CMP    CX,0            ;CHECK FOR PARTIAL BLOCK
  215.     JNE    DPF040            ;BRANCH IF DATA IN BUFFER
  216. ;
  217.     RET                ;TERMINATE PROGRAM EXECUTION
  218. ;
  219. ;    CONVERT DATA TO DISPLAYABLE ASCII AND DISPLAY
  220. ;
  221. DPF040:
  222.     MOV    DI,OFFSET BCOUNT    ;DI = BLOCK COUNT ADDRESS
  223.     MOV    AX,[BP]            ;AX = CURRENT BLOCK COUNT
  224.     INC    AX            ;INCREMENT BLOCK COUNT
  225.     MOV    [BP],AX            ;SAVE NEW BLOCK COUNT
  226.     DEC    AX            ;DECREMENT BLOCK COUNT
  227.     CALL    BDCONV            ;BINARY TO DECIMAL CONVERSION
  228.     MOV    DX,OFFSET BLKNUM    ;DX = BLOCK NUMBER MESSAGE
  229.     MOV    AH,09H            ;AH = 9 = DISPLAY BLOCK NUMBER
  230.     INT    21H            ;CALL DOS FOR SERVICE
  231.     MOV    SI,OFFSET FILBUF    ;SI = FILE I/O BUFFER ADDRESS
  232.     MOV    DI,OFFSET DPLINE+12    ;DI = HEXADECIMAL DISPLAY AREA
  233.     MOV    BP,OFFSET DPLINE+62    ;BP = ASCII DISPLAY AREA
  234.     MOV    CX,32            ;CX = NUMBER OF 16 BYTE LINES
  235.     PUSH    CX            ;SAVE CX REGISTER ON THE STACK
  236.     MOV    CX,16            ;CONVERSION LOOP COUNTER
  237. ;
  238.     PAGE
  239. ;
  240. ;    CONVERT A BYTE OF INPUT DATA TO HEXADECIMAL
  241. ;
  242. DPF050:
  243.     CMP    CX,8            ;HALF OF LINE CONVERTED?
  244.     JNE    DPF060            ;BRANCH TO CONTINUE - NOT HALF
  245.     DEC    DI            ;DECREMENT LINE POSITION INDEX
  246.     MOV    AL,'-'            ;MOVE A DASH TO SEPARATE HALFS
  247.     MOV    [DI],AL            ;MOVE A DASH TO SEPARATE HALFS
  248.     INC    DI            ;INCREMENT LINE POSITION INDEX
  249. ;
  250. ;    SAVE CX ON THE STACK AND PROCESS NEXT BYTE
  251. ;
  252. DPF060:
  253.     PUSH    CX            ;SAVE CONVERSION LOOP COUNTER
  254.     MOV    CL,4            ;CL = 4 = SHIFT COUNTER
  255.     MOV    AL,[SI]            ;AL = FILE BUFFER CHARACTER
  256.     MOV    AH,AL            ;AH = FILE BUFFER CHARACTER
  257.     CMP    AH,20H            ;COMPARE AH AN ASCII " "
  258.     JL    DPF070            ;BRANCH IF UNDISPLAYABLE
  259.     CMP    AH,7EH            ;COMPARE AH TO ASCII "~"
  260.     JNG    DPF080            ;BRANCH IF DISPLAYABLE
  261. ;
  262. ;    SET AH TO AN ASCII PERIOD // NON-DISPLAYABLE CHARACTER
  263. ;
  264. DPF070:
  265.     MOV    AH,"."            ;AH = AN ASCII PERIOD
  266. ;
  267. ;    AH CONTAINS THE DISPLAYABLE ASCII CHARACTER
  268. ;
  269. DPF080:
  270.     MOV    DS:[BP],AH        ;MOVE CHARACTER TO ASCII AREA
  271.     SUB    AH,AH            ;AH = ZEROS // SET FOR CONVERT
  272.     SHL    AX,CL            ;POSITION UPPER CL BITS OF AL
  273.     SHR    AL,CL            ;POSITION LOWER CL BITS OF AL
  274.     XCHG    AL,AH            ;EXCHANGE CONTENTS OF AL AND AH
  275.     PUSH    AX            ;SAVE CONTENTS OF AX ON STACK
  276.     MOV    BX,OFFSET ASCIIT    ;BX = ASCII TABLE ADDRESS
  277.     XLAT    ASCIIT            ;CONVERT CHARACTER TO HEX
  278.     MOV    [DI],AL            ;MOVE CHARACTER TO DISPLAY LINE
  279.     INC    DI            ;INCREMENT STORAGE INDEX
  280.     POP    AX            ;RESTORE ORIGINAL AX CONTENTS
  281.     MOV    CL,8            ;CL = 8 = SHIFT COUNTER
  282.     SHR    AX,CL            ;POSITION UPPER 8 BITS
  283.     XLAT    ASCIIT            ;CONVERT CHARACTER TO HEX
  284.     MOV    [DI],AL            ;MOVE CHARACTER TO DISPLAY LINE
  285.     ADD    DI,2            ;INCREMENT DI FOR NEXT BYTE
  286.     INC    SI            ;INCREMENT SI FOR NEXT BYTE
  287.     INC    BP            ;INCREMENT BP FOR NEXT BYTE
  288.     POP    CX            ;RESTORE LOOP CONTROL COUNTER
  289.     LOOP    DPF050            ;BRANCH TO CONVERT FULL LINE
  290. ;
  291.     PAGE
  292. ;
  293. ;    CONVERT AND SETUP RELATIVE BUFFER OFFSET
  294. ;
  295.     MOV    AX,HEXCNT        ;AX = CURRENT BUFFER OFFSET
  296.     MOV    DI,OFFSET DPLINE+6    ;DI = DISPLAY LINE OFFSET
  297.     PUSH    SI            ;SAVE BUFFER INDEX ON STACK
  298.     CALL    BDCONV            ;BINARY TO DECIMAL CONVERSION
  299.     POP    SI            ;RESTORE BUFFER INDEX
  300.     MOV    DI,OFFSET DPLINE    ;DI = DISPLAY LINE OFFSET
  301.     MOV    AX,HEXCNT        ;AX = CURRENT BUFFER OFFSET
  302.     MOV    CX,4            ;CX = LOOP COUNTER (4 BYTES)
  303. ;
  304. ;    CONVERT HEXADECIMAL TO ASCII // BUFFER OFFSET
  305. ;
  306. DPF090:
  307.     PUSH    CX            ;SAVE LOOP COUNTER ON STACK
  308.     MOV    CL,4            ;CL = 4 = SHIFT COUNTER
  309.     PUSH    AX            ;SAVE CURRENT BUFFER OFFSET
  310.     AND    AX,0F000H        ;ISOLATE UPPER NIBBLE // 4 BITS
  311.     XCHG    AL,AH            ;EXCHANGE VALUES IN AL AND AH
  312.     SHR    AL,CL            ;POSITION 4-BIT NIBBLE
  313.     XLAT    ASCIIT            ;CONVERT TO HEXADECIMAL BYTE
  314.     MOV    [DI],AL            ;STORE CONVERTED BYTE // HEX
  315.     INC    DI            ;INCREMENT BYTE STORAGE INDEX
  316.     POP    AX            ;RESTORE CONTENTS TO AX
  317.     SHL    AX,CL            ;POSITION NEXT 4-BIT NIBBLE
  318.     POP    CX            ;RESTORE THE LOOP COUNTER
  319.     LOOP    DPF090            ;LOOP TO CONVERT ALL NIBBLES
  320. ;
  321. ;    DISPLAY THE LAST LINE CONVERTED
  322. ;
  323.     ADD    HEXCNT,16        ;UPDATE HEX OFFSET COUNTER
  324.     MOV    BX,OFFSET DPLINE    ;BX = HEXADECIMAL DISPLAY AREA
  325.     MOV    CX,80            ;CX = DISPLAY LINE BYTE COUNT
  326. ;
  327. ;    DISPLAY A CONVERTED BYTE OF DATA
  328. ;
  329. DPF100:
  330.     MOV    DL,[BX]            ;DL = CONVERTED DATA BYTE
  331.     INC    BX            ;INCREMENT BX TO NEXT BYTE
  332.     MOV    AH,02H            ;AH = 2 = DISPLAY CHARACTER
  333.     INT    21H            ;CALL DOS FOR SERVICE
  334.     LOOP    DPF100            ;BRANCH TO DISPLAY NEXT BYTE
  335.     POP    CX            ;RESTORE BLOCK COUNTER
  336.     LOOP    DPF110            ;BRANCH TO PRINT NEXT LINE
  337.     MOV    HEXCNT,0        ;RESET THE HEX OFFSET COUNTER
  338.     MOV    DX,OFFSET FMFEED    ;DX = CR, LF, AND FF BUFFER
  339.     MOV    AH,09H            ;AH = 9 = WRITE DATA TO DISPLAY
  340.     INT    21H            ;CALL DOS FOR SERVICE
  341.     SUB    BP,BP            ;BP = ZERO - FOR BLOCK NUMBER
  342.     JMP    DPF020            ;BRANCH TO READ NEXT BLOCK
  343.     PAGE
  344. ;
  345. ;    CONVERT AND DISPLAY NEXT 16 BYTES OF DATA
  346. ;
  347. DPF110:
  348.     PUSH     CX            ;SAVE CONTENTS OF LINE COUNTER
  349.     MOV    AX,2020H        ;AX = 2 ASCII SPACES
  350.     MOV    CX,39            ;CX = NUMBER OF WORDS TO SET
  351.     MOV    DI,OFFSET DPLINE    ;DI = DISPLAY LINE OFFSET
  352. ;
  353. ;    MOVE ASCII SPACES TO THE DISPLAY LINE BUFFER
  354. ;
  355. DPF120:
  356.     MOV    [DI],AX            ;MOVE SPACES TO DISPLAY LINE
  357.     ADD    DI,2            ;INCREMENT DI BY WORDS
  358.     LOOP    DPF120            ;BRANCH TO SET ALL WORDS
  359. ;
  360.     MOV    DI,OFFSET DPLINE+12    ;DI = HEXADECIMAL DISPLAY AREA
  361.     MOV    BP,OFFSET DPLINE+62    ;BP = ASCII DISPLAY AREA
  362.     MOV    CX,16            ;RESET LINE CONVERSION COUNTER
  363.     JMP    DPF050            ;BRANCH TO CONVERT NEXT LINE
  364. ;
  365. DPFILE    ENDP
  366.     PAGE
  367. ;
  368. ;    BINARY TO DECIMAL (ASCII) CONVERSION
  369. ;
  370. BDCONV    PROC    NEAR
  371.     MOV    CX,3            ;CX = LOOP COUNTER
  372.     SUB    SI,SI            ;SI = ZERO // FOR INDEX
  373. ;
  374. ;    BINARY TO DECIMAL CONVERSION LOOP
  375. ;
  376. BDC010:
  377.     SUB    DX,DX            ;DX = ZERO // FOR DIVISION
  378.     DIV    BINDEC[SI]        ;DIVIDE FOR DECIMAL DIGIT
  379.     ADD    AL,30H            ;ADD 30H FOR ASCII NUMBER
  380.     MOV    [DI],AL            ;STORE ASCII NUMERIC DIGIT
  381.     INC    DI            ;INCREMENT FOR NEXT NUMBER
  382.     ADD    SI,2            ;INCREMENT SI FOR NEXT NUMBER
  383.     MOV    AX,DX            ;RESTORE REMAINDER TO AX
  384.     LOOP    BDC010            ;BRANCH TO CONVERT ALL DATA
  385. ;
  386.     ADD    AL,30H            ;ADD 30H FOR ASCII
  387.     MOV    [DI],AL            ;STORE ASCII NUMERIC DIGIT
  388.     RET                ;RETURN TO CALLER
  389. ;
  390. BDCONV    ENDP
  391. ;
  392. CODSEG    ENDS
  393.     END    DPFILE
  394.